🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / feature / discovery / src / commonTest / kotlin / org / meshtastic / feature / discovery / DiscoverySummaryGeneratorTest.kt
Displaying Raw • Download
feature/discovery/src/commonTest/kotlin/org/meshtastic/feature/discovery/DiscoverySummaryGeneratorTest.kt bf929c20f274232e0eb8ddc19b2dc82403e99e5b (bf929c20) Text, 12.05 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tf0883e@fileTb4b4b4:Te6edf3SuppressTb4b4b4(Ta5d6ff"Ta5d6ffMagicNumberTa5d6ff"Tb4b4b4)
Tff7b72package T7ee787org.meshtastic.feature.discovery
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoveryPresetResultEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.DiscoverySessionEntity
Tff7b72import T7ee787kotlin.test.Test
Tff7b72import T7ee787kotlin.test.assertContains
Tff7b72import T7ee787kotlin.test.assertEquals
Tff7b72import T7ee787kotlin.test.assertFalse
Tff7b72import T7ee787kotlin.test.assertTrue
Tff7b72class T56d364DiscoverySummaryGeneratorTest Tb4b4b4{
Tff7b72private Tff7b72val Te6edf3generator Tff7b72= Te6edf3DiscoverySummaryGeneratorTb4b4b4(Tb4b4b4)
T8b949e// ---- Helpers ----
Tff7b72private Tff7b72fun Td2a8ffsessionTb4b4b4(
Te6edf3idTb4b4b4: Tffa657Long Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3totalUniqueNodesTb4b4b4: Tffa657Int Tff7b72= T79c0ff1T79c0ff0Tb4b4b4,
Te6edf3completionStatusTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4,
Te6edf3avgChannelUtilizationTb4b4b4: Tffa657Double Tff7b72= T79c0ff0.0Tb4b4b4,
Tb4b4b4) Tff7b72= Te6edf3DiscoverySessionEntityTb4b4b4(
Te6edf3id Tff7b72= Te6edf3idTb4b4b4,
Te6edf3timestamp Tff7b72= T79c0ff1Te6edf3_000_000LTb4b4b4,
Te6edf3presetsScanned Tff7b72= Ta5d6ff"Ta5d6ffLongFast,ShortFastTa5d6ff"Tb4b4b4,
Te6edf3homePreset Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4,
Te6edf3totalUniqueNodes Tff7b72= Te6edf3totalUniqueNodesTb4b4b4,
Te6edf3avgChannelUtilization Tff7b72= Te6edf3avgChannelUtilizationTb4b4b4,
Te6edf3completionStatus Tff7b72= Te6edf3completionStatusTb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Td2a8ffpresetTb4b4b4(
Te6edf3idTb4b4b4: Tffa657Long Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3sessionIdTb4b4b4: Tffa657Long Tff7b72= T79c0ff1Tb4b4b4,
Te6edf3nameTb4b4b4: Tffa657String Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4,
Te6edf3uniqueNodesTb4b4b4: Tffa657Int Tff7b72= T79c0ff5Tb4b4b4,
Te6edf3directNeighborCountTb4b4b4: Tffa657Int Tff7b72= T79c0ff3Tb4b4b4,
Te6edf3meshNeighborCountTb4b4b4: Tffa657Int Tff7b72= T79c0ff2Tb4b4b4,
Te6edf3messageCountTb4b4b4: Tffa657Int Tff7b72= T79c0ff1T79c0ff0Tb4b4b4,
Te6edf3sensorPacketCountTb4b4b4: Tffa657Int Tff7b72= T79c0ff5Tb4b4b4,
Te6edf3avgChannelUtilizationTb4b4b4: Tffa657Double Tff7b72= T79c0ff1T79c0ff5.0Tb4b4b4,
Te6edf3avgAirtimeRateTb4b4b4: Tffa657Double Tff7b72= T79c0ff3.0Tb4b4b4,
Te6edf3packetSuccessRateTb4b4b4: Tffa657Double Tff7b72= T79c0ff0.95Tb4b4b4,
Te6edf3packetFailureRateTb4b4b4: Tffa657Double Tff7b72= T79c0ff0.05Tb4b4b4,
Tb4b4b4) Tff7b72= Te6edf3DiscoveryPresetResultEntityTb4b4b4(
Te6edf3id Tff7b72= Te6edf3idTb4b4b4,
Te6edf3sessionId Tff7b72= Te6edf3sessionIdTb4b4b4,
Te6edf3presetName Tff7b72= Te6edf3nameTb4b4b4,
Te6edf3uniqueNodes Tff7b72= Te6edf3uniqueNodesTb4b4b4,
Te6edf3directNeighborCount Tff7b72= Te6edf3directNeighborCountTb4b4b4,
Te6edf3meshNeighborCount Tff7b72= Te6edf3meshNeighborCountTb4b4b4,
Te6edf3messageCount Tff7b72= Te6edf3messageCountTb4b4b4,
Te6edf3sensorPacketCount Tff7b72= Te6edf3sensorPacketCountTb4b4b4,
Te6edf3avgChannelUtilization Tff7b72= Te6edf3avgChannelUtilizationTb4b4b4,
Te6edf3avgAirtimeRate Tff7b72= Te6edf3avgAirtimeRateTb4b4b4,
Te6edf3packetSuccessRate Tff7b72= Te6edf3packetSuccessRateTb4b4b4,
Te6edf3packetFailureRate Tff7b72= Te6edf3packetFailureRateTb4b4b4,
Tb4b4b4)
T8b949e// ---- generateSessionSummary ----
Tf0883e@Test
Tff7b72fun Td2a8ffemptyPresetsReturnsNoPresetsMessageTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3assertEqualsTb4b4b4(Ta5d6ff"Ta5d6ffNo presets were scanned during this session.Ta5d6ff"Tb4b4b4, Te6edf3resultTb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsinglePresetSessionMentionsPresetNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff7Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff7Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsinglePresetSessionIncludesChannelUtilizationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff1T79c0ff2.5Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff12.5%Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffmultiPresetSessionRanksByNodeCountTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3winner Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff1Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff1T79c0ff2Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff2T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3loser Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff2Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffShortFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff4Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff1T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3loserTb4b4b4, Te6edf3winnerTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffmost nodesTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffmultiPresetSessionMentionsAlternativePresetsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3winner Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff1Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff1T79c0ff2Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff2T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3loser Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff2Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffShortFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff4Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff1T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3loserTb4b4b4, Te6edf3winnerTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffShortFastTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff4 nodeTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffhighCongestionGeneratesWarningTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3congested Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff3T79c0ff5.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3congestedTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffcongestionTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fflowCongestionNoWarningTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3clear Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff1T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3clearTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffcongestionTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould not mention congestion at 10%Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffchatDominatedTrafficNotedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3chatHeavy Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3messageCount Tff7b72= T79c0ff1T79c0ff0T79c0ff0Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff5Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3chatHeavyTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffchat-dominatedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsensorDominatedTrafficNotedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3sensorHeavy Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3messageCount Tff7b72= T79c0ff2Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff5T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3sensorHeavyTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffsensor-dominatedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8fflowTrafficCountsNoMixNoteTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3lowTraffic Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3messageCount Tff7b72= T79c0ff3Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff1Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3lowTrafficTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffdominatedTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould not classify traffic mix below thresholdTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffequalTrafficMixNoNoteTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3balanced Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3messageCount Tff7b72= T79c0ff0Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3balancedTb4b4b4)Tb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffdominatedTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould not mention traffic mix when counts are zeroTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffcompletedSessionRecommendationSaysCompletedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Te6edf3completionStatus Tff7b72= Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffcompletedTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffRecommendationTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffstoppedSessionRecommendationSaysPartialTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Te6edf3completionStatus Tff7b72= Ta5d6ff"Ta5d6ffstoppedTa5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffpartially completedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffrecommendationIncludesBestPresetNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3winner Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff1Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffMediumSlowTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff1T79c0ff5Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff5.0Tb4b4b4)
Tff7b72val Te6edf3loser Tff7b72= Te6edf3presetTb4b4b4(Te6edf3id Tff7b72= T79c0ff2Tb4b4b4, Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff3Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff5.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generateSessionSummaryTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3loserTb4b4b4, Te6edf3winnerTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffRecommendation: Use MediumSlowTa5d6ff"Tb4b4b4)
Tb4b4b4}
T8b949e// ---- generatePresetSummary ----
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryIncludesPresetNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)Tb4b4b4)
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryIncludesNodeCountsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3uniqueNodes Tff7b72= T79c0ff8Tb4b4b4, Te6edf3directNeighborCount Tff7b72= T79c0ff5Tb4b4b4, Te6edf3meshNeighborCount Tff7b72= T79c0ff3Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff8 nodesTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff5 directTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff3 meshTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryIncludesChannelUtilizationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3avgChannelUtilization Tff7b72= T79c0ff4T79c0ff2.7Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff42.7%Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffchannel utilizationTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryHighCongestionMarkedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3avgChannelUtilization Tff7b72= T79c0ff3T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffcongestedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryLowCongestionNotMarkedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3avgChannelUtilization Tff7b72= T79c0ff2T79c0ff0.0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertFalseTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffcongestedTa5d6ff"Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryChatDominatedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3messageCount Tff7b72= T79c0ff5T79c0ff0Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff5Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffchat-dominatedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummarySensorDominatedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3messageCount Tff7b72= T79c0ff2Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff4T79c0ff0Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffsensor-dominatedTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetSummaryKnownPresetIncludesDataRateTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLong FastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3generatePresetSummaryTb4b4b4(Te6edf3pTb4b4b4)
T8b949e// "Long Fast" matches LoRaPresetReference key and should include data rate
Te6edf3assertTrueTb4b4b4(Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffkbpsTa5d6ff"Tb4b4b4) Tff7b72|Tff7b72| Te6edf3resultTb4b4b4.Te6edf3containsTb4b4b4(Ta5d6ff"Ta5d6ffbpsTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffShould include data rate for known presetTa5d6ff"Tb4b4b4)
Tb4b4b4}
T8b949e// ---- buildSessionPrompt ----
Tf0883e@Test
Tff7b72fun Td2a8ffsessionPromptContainsInstructionsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff5Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildSessionPromptTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffAnalyze this Meshtastic mesh radio discovery scanTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffrecommend the best modem presetTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffconciseTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsessionPromptContainsSessionMetadataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3s Tff7b72= Te6edf3sessionTb4b4b4(Te6edf3totalUniqueNodes Tff7b72= T79c0ff1T79c0ff5Tb4b4b4, Te6edf3completionStatus Tff7b72= Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildSessionPromptTb4b4b4(Te6edf3sTb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff15 unique nodesTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffcompleteTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsessionPromptContainsPresetDataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffShortFastTa5d6ff"Tb4b4b4, Te6edf3uniqueNodes Tff7b72= T79c0ff8Tb4b4b4, Te6edf3messageCount Tff7b72= T79c0ff2T79c0ff0Tb4b4b4, Te6edf3sensorPacketCount Tff7b72= T79c0ff3Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildSessionPromptTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffShortFastTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffNodes: 8Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffMessages: 20Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsessionPromptContainsChannelUtilizationTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4, Te6edf3avgChannelUtilization Tff7b72= T79c0ff3T79c0ff3.5Tb4b4b4, Te6edf3avgAirtimeRate Tff7b72= T79c0ff5.2Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildSessionPromptTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff33.5Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff5.2Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffsessionPromptContainsCongestionGuidanceTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildSessionPromptTb4b4b4(Te6edf3sessionTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3listOfTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffChannel util >25% indicates congestionTa5d6ff"Tb4b4b4)
Tb4b4b4}
T8b949e// ---- buildPresetPrompt ----
Tf0883e@Test
Tff7b72fun Td2a8ffpresetPromptContainsPresetNameTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffMediumFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildPresetPromptTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffMediumFastTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffsummarizeTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetPromptContainsMetricsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72=
Te6edf3presetTb4b4b4(
Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4,
Te6edf3uniqueNodes Tff7b72= T79c0ff6Tb4b4b4,
Te6edf3directNeighborCount Tff7b72= T79c0ff4Tb4b4b4,
Te6edf3meshNeighborCount Tff7b72= T79c0ff2Tb4b4b4,
Te6edf3avgChannelUtilization Tff7b72= T79c0ff1T79c0ff8.0Tb4b4b4,
Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildPresetPromptTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffNodes: 6Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffDirect: 4Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffMesh: 2Ta5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ff18.0Ta5d6ff"Tb4b4b4)
Tb4b4b4}
Tf0883e@Test
Tff7b72fun Td2a8ffpresetPromptContainsGuidanceContextTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3p Tff7b72= Te6edf3presetTb4b4b4(Te6edf3name Tff7b72= Ta5d6ff"Ta5d6ffLongFastTa5d6ff"Tb4b4b4)
Tff7b72val Te6edf3result Tff7b72= Te6edf3generatorTb4b4b4.Te6edf3buildPresetPromptTb4b4b4(Te6edf3pTb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6fftraffic patternTa5d6ff"Tb4b4b4)
Te6edf3assertContainsTb4b4b4(Te6edf3resultTb4b4b4, Ta5d6ff"Ta5d6ffnode densityTa5d6ff"Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.11s